﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;


namespace questionario
{
    public class Questao
    {
        


        /// <summary>
        /// opções de determinada questão
        /// </summary>
        private List<Opcao> opcoes=new List<Opcao>();
        /// <summary>
        /// contador interno da lista da questão
        /// </summary>
        char contador = (char)65;

        private string Pergunta;

        /// <summary>
        /// Pergunta de determinada questão
        /// </summary>
        public string pergunta
        {
            get { return Pergunta; }
            set { Pergunta = value; }
        }

        /// <summary>
        /// Construtor de questão
        /// </summary>
        public Questao(XmlElement xmlX)
        {
            // TODO: Complete member initialization

            XmlDocument xd = new XmlDocument();
            xd.LoadXml(xmlX.OuterXml);

            foreach (XmlElement xx in xd.DocumentElement)
            {
                if (xx.Name == "pergunta") {
                    this.pergunta = xx.InnerText;
                }
                if (xx.Name == "resposta")
                {
                    foreach (XmlAttribute xa in xx.Attributes)
                        if (xa.Name == "informada")
                            this.informada = int.Parse(xa.Value);
                }

                if (xx.Name == "escala")
                {
                    this.TipoPergunta = TipoPergunta.Escala;
                    Opcao opx = new Opcao(xx.InnerText);

                    int bufferCorreta=0;

                    foreach (XmlAttribute xa in xx.Attributes)
                    {
                        //if (xa.Name == "informada")
                        //    this.informada = int.Parse(xa.Value);
                        

                        if (xa.Name == "correta")
                        {
                            opx.Correta = true;
                            bufferCorreta = int.Parse(xa.Value);
                        }
                        if (xa.Name == "nomeminimo")
                            this.nomeminimo =xa.Value;
                        if (xa.Name == "nomemaximo")
                            this.nomemaximo = xa.Value;
                        if (xa.Name == "quantidade")
                            for (int i = 1; i <= int.Parse(xa.Value); i++) {
                                opx.ordem = this.contador++;
                                opx.Texto = i.ToString();

                                if (bufferCorreta == i)
                                    opx.Correta = true;

                                this.opcoes.Add(opx);

                                opx = new Opcao(xx.InnerText);
                            }

                    }

                    
                }

                if (xx.Name == "opcao") {
                    Opcao opx = new Opcao(xx.InnerText);

                    foreach (XmlAttribute xa in xx.Attributes)
                        if (xa.Name == "correta")
                            opx.Correta = true;

                    opx.ordem = this.contador;

                    this.opcoes.Add(opx);
                }

            }

        }


        /// <summary>
        /// Opções de determinada questão
        /// </summary>
        public List<Opcao> Opcoes
        {
            get { return opcoes; }
            set { opcoes = value; }
        }

        /// <summary>
        /// Imprime em console determinada questão
        /// </summary>
        internal string Imprimir()
        {
            string sx="";

            Console.WriteLine(this.pergunta);
            sx += pergunta;

            foreach (Opcao o in opcoes)
            {
                
                sx+=o.Imprimir();
            }

            return sx;
        }

        /// <summary>
        /// Gera controles de determinada questão
        /// </summary>
        internal System.Windows.Forms.Control  GerarControle(int contador,bool correcao)
        {
            questaoControl qx = new questaoControl();
            qx.CreateControl();

            qx.Numerador.Text = (char)((int)this.contador+contador) + ")";
            qx.Pergunta.Text = this.pergunta;

            if (this.tipoPergunta == TipoPergunta.Radio || this.tipoPergunta == TipoPergunta.Escala)
            {

                int hPos = 10;
                int vPos = 80;
                for (int i = 0; i <= opcoes.Count - 1; i++)
                {
                    System.Windows.Forms.RadioButton rx = new System.Windows.Forms.RadioButton();
                    rx.Text = this.opcoes[i].Texto;

                    

                    if (correcao)
                        if (i + 1 == this.informada)
                        {
                            rx.Checked = true;

                            if (this.GetCorrecao())
                                qx.Controls["correto"].Visible = true;
                        }

                    rx.AutoSize = true;

                    if (tipoPergunta == TipoPergunta.Radio)
                    {
                        rx.Left = 15;
                        rx.Top = hPos;

                        hPos += rx.Height;
                    }
                    else
                    {
                        qx.lblMinimo.Text = this.nomeminimo;
                        qx.lblMaximo.Text = this.nomemaximo;

                        qx.lblMinimo.Visible = true;
                        qx.lblMaximo.Visible = true;


                        hPos = 80;
                        rx.Top = hPos;
                        rx.Left += vPos;
                    }

                    
                    //rx.Left = vPos;

                    
                    vPos += 50;


                    
                    qx.painelOpcoes.Controls.Add(rx);
                }
            }
            //qx.painelOpcoes.Controls["PainelOpcoes"].;

            return qx;
            
        }

        /// <summary>
        /// Get correção de determinada questão
        /// </summary>
        public bool GetCorrecao() {

            int i = 1;
            foreach (Opcao o in opcoes)
            {
                if (o.Correta)
                    if (i == this.informada)
                        return true;
                i++;
            }

            return false;
        }


        /// <summary>
        /// Resposta informada para determinada questão
        /// </summary>
        public int informada { get; set; }

        public int correta { get; set; }

        private TipoPergunta tipoPergunta = TipoPergunta.Radio;

        public TipoPergunta TipoPergunta
        {
            get { return tipoPergunta; }
            set { tipoPergunta = value; }
        }


        public string nomeminimo { get; set; }

        public string nomemaximo { get; set; }

        
    }
}
